package me.alex.learnkotlin.learnKT8

import java.util.*

/**
 * 学习 扩展函数 和 运算符重载
 */
fun main() {
    /*
    扩展函数介绍:
    在不修改某个类源码的情况下,仍然可以打开这个类,向这个类添加新的函数
    ps:盲猜可以对一些三方库,在不下载源码到本地的情况下也注入自己需要的函数
     */

    //1.1 String扩展函数示例
    //扩展函数语法结构 有返回值写法与普通函数相同, 主要是 ClassName.methodName
    /*
    fun ClassName.methodName(obj: Object){

    }
     */

    //获取字符串中有几个字母 结果是6
    //相当于让String类自带了lettersCount()方法
    val str = "ABC123xyz!@#"
    val strCount = str.lettersCount()
    println("strCount is $strCount")
    //另外kotlin提供的扩展函数如:
    //反转字符串
    println("reversed is ${str.reversed()}")
    //第一组字母变大写
    println("replaceFirstChar is ${str.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }}")


    //1.2 运算符重载
    /**
     * Java中的 + - * / % ++ --等运算符和关键字在kotlin中也可以进行重载
     * 关键字 operator
     */
    //这里操作2个对象试一下
    val money1 = Money(5)
    val money2 = Money(10)
    val money3 = money1 + money2
    println("money3 = ${money3.num}")
    //还可以进行二次重载
    val money4 = money3 + 20
    println("money4 = ${money4.num}")

    /*
    语法糖 和 实际调用函数 对照表
    语法糖                     实际调用函数
    a+b                     a.plus(b)
    a-b                     a.minus(b)
    a*b                     a.times(b)
    a/b                     a.div(b)
    a%b                     a.rem(b)
    a++                     a.inc()
    a--                     a.dec()
     +a                     a.unaryPlus()
     -a                     a.unaryMinus()
     !a                     a.not()
    a==b                    a.equals(b)
    a>b                     a.compareTo(b)
    a<b                     a.compareTo(b)
    a>=b                    a.compareTo(b)
    a<=b                    a.compareTo(b)
    a..b                    a.rangeTo(b)
    a[b]                    a.get(b)
    a[b]=c                  a.set(b,c)
    a in b                  b.contains(a)
    这里注意a in b 判断a是否在b中 顺序是相反的 所以使用b.contains(a),判断b中是否包含a
    例:
    if("hello".contains("he") ....
    重载后:
    if("he" in "hello") ....
     */

    /**
     * 练习 生成重复数量字符串
     * {@link String.times(n: Int)}
     */


    val str1 = "test" * 3
    println(str1)
}